iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Python

Python和R入門語法比較系列 第 29

15 [Python] for 迴圈 和 html網頁資料解析 by bs4套件(BeautifulSoup) [16th 鐵人 Day 29]

  • 分享至 

  • xImage
  •  

for 迴圈(復習)

way 1: for i in range( ): print( )

for i in range(5):
    print(i)
    0
    1
    2
    3
    4

range(次數+1)

range(起點, 次數+1)

for i in range(1, 5+1):
    print(i)
    1
    2
    3
    4
    5

way 2: for i in list/Series: print( )

L = [1,2,3,4,5]
for i in L:
    print(i)
    1
    2
    3
    4
    5

網頁資料的長像: 以ptt為例

1. 網頁

https://ithelp.ithome.com.tw/upload/images/20240923/20162398wVa8DUoZcL.png

2. 網頁原始碼

https://ithelp.ithome.com.tw/upload/images/20240923/20162398PRHQEc1J4K.png

對原始碼解析:安裝bs4套件

pip install bs4

載入bs4底下的BeautifulSoup套件

from bs4 import BeautifulSoup as bs

網頁

https://ithelp.ithome.com.tw/upload/images/20240923/201623984tpjB5XeC7.png

網頁原始碼會是字串的樣子

s = '''<div class="nrec" style="-webkit-text-stroke-width:0px;color:rgb(187, 187, 187);display:inline-block;float:left;font-family:serif;font-size:medium;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;min-height:1em;orphans:2;padding:0.5ex 0px 0px;text-align:right;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;vertical-align:middle;white-space:normal;widows:2;width:4ex;word-spacing:0px;"><span style="color:rgb(255,255,102);"><span class="hl f3">38</span></span></div>
<div class="title" style="-webkit-text-stroke-width:0px;color:rgb(187, 187, 187);display:block;font-family:Times;font-size:medium;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;margin:0px 5ex;min-height:1em;orphans:2;padding:0.5ex 0px 0px;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;vertical-align:middle;white-space:normal;widows:2;word-spacing:0px;"><a style="color:rgb(170, 170, 170);text-decoration:none;" target="_blank" rel="noopener noreferrer" href="https://www.ptt.cc/bbs/Baseball/M.1726184897.A.8E7.html">[問題] 平野怎麼寫昨晚的報告</a></div>
<div class="meta" style="-webkit-text-stroke-width:0px;color:rgb(187, 187, 187);display:block;font-family:Times;font-size:medium;font-style:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-weight:400;letter-spacing:normal;margin:0px 0px 0px 5ex;min-height:1em;orphans:2;text-align:start;text-decoration-color:initial;text-decoration-style:initial;text-decoration-thickness:initial;text-indent:0px;text-transform:none;vertical-align:middle;white-space:normal;widows:2;word-spacing:0px;">
    <div class="author" style="display:inline-block;font-family:Inconsolata, serif;padding:0.5ex 0px;">kcola</div>
</div>'''
s

https://ithelp.ithome.com.tw/upload/images/20240923/20162398eWarSH6nOU.png

html的結構 html head body div a
< html>
< head >
< /head >
< body >
< div >
< a >
< /a >
< /div >
< /body >
< /html >

bs(字串, '解析方法') 這邊我們使用 'html5lib' 這個方法

bs(s, 'html5lib')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398F4vp9olCyg.png

將 bs 解析過的資料存成 tmp1

tmp1 = bs(s, 'html5lib')

https://ithelp.ithome.com.tw/upload/images/20240923/201623985YuHFYOpyT.png

.select 選取 html 標籤: html, head, body, div, a

tmp1.select('html')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398lXcqA6Un1f.png

tmp1.select('head')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398ez31UBPmmd.png

tmp1.select('body')

https://ithelp.ithome.com.tw/upload/images/20240923/201623984ZLYdN5XRJ.png

tmp1.select('div')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398N3cNxKaNuU.png

tmp1.select('a')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398zSpJnDHWG5.png

增加select條件

tmp1.select('div.title')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398UpQm7eQQrV.png

tmp1.select('div.title>a')

https://ithelp.ithome.com.tw/upload/images/20240923/20162398Vvu1KvBQKL.png

取得 href 連結

查看 .select( ) 之後的形態

a = tmp1.select('div.title>a')
type(a)
    list

查看 list 的長度

len(a)
    1

用 for i in list 取得 list a(標籤a) 的內容

for i in a:
    print(i)

https://ithelp.ithome.com.tw/upload/images/20240923/20162398VzmlgUcED8.png

* .get( ) 取得 標籤 < a > 裡面的資料

for i in a:
    print(i.get('href'))
    print(i.get('rel'))
    print(i.get('style'))

https://ithelp.ithome.com.tw/upload/images/20240923/20162398krubt6IpCo.png

* .text 取得 文字

for i in a:
    print(i.text)

https://ithelp.ithome.com.tw/upload/images/20240923/20162398lRS3w4oyWx.png

末篇預告

15 [R] for 迴圈 和 html網頁資料解析 httr, xml2


上一篇
14 [R] for迴圈 和 ggplot 畫線圖 [16th 鐵人 Day 28]
下一篇
15 [R] for 迴圈 和 html網頁資料解析 httr, xml2, [16th 鐵人 Day 30]
系列文
Python和R入門語法比較30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言